package vue;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

import modele.Equipe;
import modele.Match;

public class PopupNouveauxMatchs extends JFrame implements ActionListener {

	private JTable table;
	private JScrollPane scroll;
	private DefaultTableModel model;
	private FenetrePrincipale ihm;
	private JButton valider, annuler, ajouter, modifier, supprimer;
	private int nbLigneCrees = 0;
	private JTextField tfDateMatch, tfLieuMatch;
	private JComboBox comboBoxEq1, comboBoxEq2 ;
	private ArrayList<Match> alMatchsTmp = new ArrayList<Match>();

	public PopupNouveauxMatchs(FenetrePrincipale fep) {
		this.ihm = fep;

		setTitle("Nouveaux Matchs");
		setLocation(50, 50);
		setSize(200, 600);
		setLayout(new BorderLayout());
		
		JPanel panelG, panelC, panelD;
		
		panelG = new JPanel(new GridLayout(4, 2));
		panelC = new JPanel();
		panelD = new JPanel();
		
		comboBoxEq1 = new JComboBox();
		comboBoxEq2 = new JComboBox();
		comboBoxEq1.addItem("");
		comboBoxEq2.addItem("");
		for(Equipe equipe : ihm.getControleur().getEquipes()) {
			comboBoxEq1.addItem(equipe.getNom());
			comboBoxEq2.addItem(equipe.getNom());
		}
		
		panelG.add(new JLabel("Equipe 1 :"));
		panelG.add(comboBoxEq1);
		panelG.add(new JLabel("Equipe 2 :"));
		panelG.add(comboBoxEq2);
		panelG.add(new JLabel("Date :"));
		tfDateMatch = new JTextField("2013-12-10");
		panelG.add(tfDateMatch);
		panelG.add(new JLabel("Lieu :"));
		tfLieuMatch = new JTextField();
		panelG.add(tfLieuMatch);
		
		JPanel panelBtnCentre = new JPanel(new GridLayout(3, 1));
		ajouter = new JButton("Add ->");
		ajouter.addActionListener(this);
		modifier = new JButton("Modifier <-");
		modifier.addActionListener(this);
		supprimer = new JButton("Remove X");
		supprimer.addActionListener(this);
		
		panelBtnCentre.add(ajouter);
		//panelBtnCentre.add(modifier);
		panelBtnCentre.add(supprimer);
		panelC.add(panelBtnCentre, BorderLayout.CENTER);
		
		
		
		
		model = new DefaultTableModel() {

			public boolean isCellEditable(int row, int column) {
				return true; //column != 0 && column != 1 && column != 4;
			}
		};

		table = new JTable(model);
		
		model.addColumn("Date");
		model.addColumn("Equipe 1");
		model.addColumn("Equipe 2");
		model.addColumn("Lieu");
		
		table.getColumnModel().getColumn(0).setPreferredWidth(100);
		table.getColumnModel().getColumn(1).setPreferredWidth(120);
		table.getColumnModel().getColumn(2).setPreferredWidth(120);
		table.getColumnModel().getColumn(3).setPreferredWidth(100);
		
		scroll = new JScrollPane(table);
		scroll.setPreferredSize(new Dimension(440, 200));
		
		panelD.add(scroll);
		
		JPanel panelBas = new JPanel(new FlowLayout());

		valider = new JButton("Valider");
		valider.addActionListener(this);

		annuler = new JButton("Quitter");
		annuler.addActionListener(this);

		panelBas.add(valider);
		panelBas.add(annuler);

		this.add(panelG, BorderLayout.WEST);
		this.add(panelD, BorderLayout.EAST);
		this.add(panelC, BorderLayout.CENTER);
		this.add(panelBas, BorderLayout.SOUTH);

		this.pack();
		this.setVisible(true);
	}

	public DefaultTableModel getTableModel() {
		return model;
	}

	public JTable getTable() {
		return table;
	}

	class ClientsTableButtonRenderer extends JButton implements
			TableCellRenderer {
		public ClientsTableButtonRenderer() {
			setOpaque(false);
			this.setText("Infos");
		}

		public Component getTableCellRendererComponent(JTable table,
				Object value, boolean isSelected, boolean hasFocus, int row,
				int column) {
			setForeground(Color.black);
			setBackground(UIManager.getColor("Button.background"));
			setText("Infos");
			return this;
		}
	}

	public class ClientsTableRenderer extends DefaultCellEditor {
		private JButton button;
		private String label;
		private boolean clicked;
		private int row, col;
		private JTable table;

		public ClientsTableRenderer(JCheckBox checkBox) {
			super(checkBox);
			button = new JButton("Infos");
			button.setText("Infos");
			button.setOpaque(true);
			button.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					fireEditingStopped();
				}
			});
		}

		public Component getTableCellEditorComponent(JTable table,
				Object value, boolean isSelected, int row, int column) {
			this.table = table;
			this.row = row;
			this.col = column;

			button.setForeground(Color.black);
			button.setBackground(UIManager.getColor("Button.background"));
			label = (value == null) ? "" : value.toString();
			button.setText("Infos");
			clicked = true;
			return button;
		}

		public Object getCellEditorValue() {
			if (clicked) {

				JOptionPane.showMessageDialog(button, "RAJOUTER INFOS MATCH "
						+ table.getSelectedRow());
			}
			clicked = false;
			return new String("Infos");
		}

		public boolean stopCellEditing() {
			clicked = false;
			return super.stopCellEditing();
		}

		protected void fireEditingStopped() {
			super.fireEditingStopped();
		}
	}

	public void actionPerformed(ActionEvent e) {
		if(e.getSource() == ajouter) {
			Date dateMatch = null;
			Equipe equipe1=null, equipe2=null;
			boolean saisieCorrect 	= true;
			String dateMatchString 	= tfDateMatch.getText();
			String eq1 	= comboBoxEq1.getSelectedItem().toString();
			String eq2 	= comboBoxEq2.getSelectedItem().toString();
			String lieu = tfLieuMatch.getText();
			Match match = null;
			if(!dateMatchString.equals("") || !eq1.equals("") || !eq2.equals("") || !lieu.equals("")) {
				dateMatch = null;
				SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
				try {
					dateMatch = f.parse(dateMatchString);
				} catch (ParseException p) { 
					saisieCorrect = false;
					JOptionPane.showMessageDialog(this, "La date est dans un format incorrect. Utiliser aaaa-mm-jj.", "Erreur de date", JOptionPane.ERROR_MESSAGE); 
				}
				
				Date dateNow = new Date();
				if(saisieCorrect && dateMatch.before(dateNow)) {
					saisieCorrect = false;
					JOptionPane.showMessageDialog(this, "La date est dans le passé.", "Erreur de date", JOptionPane.ERROR_MESSAGE); 
				}
				
				equipe1 = ihm.getControleur().getEquipeViaNom(eq1);
				equipe2 = ihm.getControleur().getEquipeViaNom(eq2);
				if(saisieCorrect && (equipe1 == null || equipe2 == null)){ 
					saisieCorrect = false;
					JOptionPane.showMessageDialog(this, "Veuillez sélectionner 2 équipes.", "Erreur d'équipe", JOptionPane.ERROR_MESSAGE); 
				}

				match = ihm.getControleur().getMatchViaInfo(dateMatch, eq1);
				if(match == null) //Si on a pas trouvé de match, on regarde dans ceux en attentes
					match = ihm.getControleur().getMatchViaInfo(dateMatch, eq1, alMatchsTmp);
				if(saisieCorrect && match != null) {
					saisieCorrect = false;
					JOptionPane.showMessageDialog(this, equipe1.getNom()+" joue déjà le "+dateMatchString+".", "Double match", JOptionPane.ERROR_MESSAGE); 
				}
				
				match = ihm.getControleur().getMatchViaInfo(dateMatch, eq2);
				if(match == null) //Si on a pas trouvé de match, on regarde dans ceux en attentes
					match = ihm.getControleur().getMatchViaInfo(dateMatch, eq2, alMatchsTmp);
				if(saisieCorrect && match != null) {
					saisieCorrect = false;
					JOptionPane.showMessageDialog(this, equipe2.getNom()+" joue déjà le "+dateMatchString+".", "Double match", JOptionPane.ERROR_MESSAGE); 
				}
				
				if(saisieCorrect && equipe1.equals(equipe2)) {
					saisieCorrect = false;
					JOptionPane.showMessageDialog(this, "Une équipe ne peut pas s'affronter.", "Erreur d'équipe", JOptionPane.ERROR_MESSAGE); 
				}
				
				match = new Match(equipe1, equipe2, dateMatch, lieu, -1, -1);
				if(saisieCorrect && ihm.getControleur().isMatchExist(match)) {
					saisieCorrect = false;
					JOptionPane.showMessageDialog(this, "Le match "+equipe1.getNom()+" - "+equipe2.getNom()+" le "+dateMatchString+" existe déjà.", "Double match", JOptionPane.ERROR_MESSAGE); 
				}
				
				if(saisieCorrect && ihm.getControleur().isMatchExist(match, alMatchsTmp)) {
					saisieCorrect = false;
					JOptionPane.showMessageDialog(this, "Le match "+equipe1.getNom()+" - "+equipe2.getNom()+" le "+dateMatchString+" est déjà dans le tableau de droite.", "Double match", JOptionPane.ERROR_MESSAGE); 
				}
			}
			if(saisieCorrect) {
				model.addRow(new Object[] {dateMatchString, eq1, eq2, lieu });
				alMatchsTmp.add(new Match(equipe1, equipe2, dateMatch, lieu, -1, -1));
				nbLigneCrees++;
			}
		} else if(e.getSource() == supprimer) {
			if(table.getSelectedRow() >= 0) {
				int numLigne = table.getSelectedRow();
				String date = model.getValueAt(numLigne, 0).toString();
				String nomEq1 = model.getValueAt(numLigne, 1).toString();
				String nomEq2 = model.getValueAt(numLigne, 2).toString();
				String lieu = model.getValueAt(numLigne, 3).toString();
				Match matchASuppr = null;
				
				SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
				Date dateMatch = null;
				try {
					dateMatch = f.parse(date);
				} catch (ParseException e1) {
					e1.printStackTrace();
				}
				for(Match match : alMatchsTmp) {
					if((match.getEquipe1().getNom().equals(nomEq1) && match.getEquipe2().getNom().equals(nomEq2) ||match.getEquipe1().getNom().equals(nomEq2) && match.getEquipe2().getNom().equals(nomEq1)) &&
							match.getDate().equals(dateMatch))
						matchASuppr = match;
				}
				model.removeRow(numLigne);
				alMatchsTmp.remove(matchASuppr);
				nbLigneCrees--;
			} else
				JOptionPane.showMessageDialog(this, "Veuillez sélectionner une ligne du tableau", "Erreur de suppression", JOptionPane.ERROR_MESSAGE);
		} else if(e.getSource() == valider) {
			String dateMatchString="", 
					eq1="", 
					eq2="", 
					lieu="";
			Date dateMatch;
			SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
			for(int i=0; i<alMatchsTmp.size(); i++) {
				dateMatchString = model.getValueAt(i,0).toString();
				eq1 = model.getValueAt(i,1).toString();
				eq2 = model.getValueAt(i,2).toString();
				lieu = model.getValueAt(i,3).toString();
				if(!dateMatchString.equals("") && !eq1.equals("") && !eq2.equals("")) {
					dateMatch = null;
					try {
						dateMatch = f.parse(model.getValueAt(i,0).toString());
					} catch (ParseException p) {}
					
					Equipe equipe1 = ihm.getControleur().getEquipeViaNom(eq1);
					Equipe equipe2 = ihm.getControleur().getEquipeViaNom(eq2);
					
					Match match = new Match(equipe1, equipe2, dateMatch, lieu, -1, -1);
					ihm.getControleur().addMatchsAPronostiquer(match);
					equipe1.addMatch(match);
					equipe2.addMatch(match);
				}
			}
			ihm.getPanelPronostique().majContenu();
			//On vide le tableau
			for(int i=0; i<alMatchsTmp.size(); i++)
				model.removeRow(0);
			//On vide la liste des matchs
			alMatchsTmp.clear();
		} else if(e.getSource() == annuler)
			this.dispose();
	}
}
